package bp.sys.printer;

import bp.da.DataRow;
import bp.da.DataTable;
import bp.da.DataType;
import bp.sys.MapAttr;
import bp.sys.SysEnum;
import bp.sys.SysEnums;
import bp.sys.printer.DBModel.DB;
import bp.wf.template.Printer.FrmPrintTemplate;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class OfficerHelper {
    public FrmPrintTemplate HisFrmPrintTemplate = null;
    /**
     数据源
     */
    public DB HisDB = null;
    public String FrmID = null;
    public final void MakeDocFile(String frmID, String templateFile, FrmPrintTemplate template, long workID)
    {
    }
    public final String ContainsKey(HashMap<String, ArrayList<String>> DtlMap, String key)
    {
        for (Map.Entry<String, ArrayList<String>> kvp: DtlMap.entrySet())
        {
            // Console.WriteLine($"Key = {kvp.Key}, Value = {kvp.Value}");
            if (kvp.getKey().split("@")[0].equals(key))
            {
                return kvp.getKey();
            }
        }
        return "";
    }
    public final String EnumKey(HashMap<String, SysEnums> EnumMap, String key, String val)
    {
        //枚举字段
        if (EnumMap.containsKey(key))
        {
            SysEnums Enums = EnumMap.get(key);
            for (SysEnum e : Enums.ToJavaList())
            {
                String lab = e.getLab();
                int IntKey = e.getIntKey();
                if (String.valueOf(IntKey).equals(val))
                {
                    return lab;
                }
            }
        }
        else
        {
            return val;
        }
        return "";
    }

    public final void MakeExcelFile(String frmID, String templateFile, FrmPrintTemplate template, long workID) throws Exception {
        this.FrmID = frmID;
        this.HisFrmPrintTemplate = template;

        //生成数据源.
//        this.HisDB = new bp.sys.printer.DB(template.getFrmID(), template.getFrmID(), template.getMyPK(), workID);
//        FileInputStream file = new FileInputStream(templateFile);
//        ///#region 1. 打开excel准备工作.
//        Workbook workbook = new XSSFWorkbook(file);
//        Sheet worksheet = workbook.getSheetAt(1); // 获取第一个工作表
//        //var value = worksheet.Cell("A1").GetString(); // 获取单元格 A1 的值
//        ///#endregion 打开excel准备工作.
//
//        ///#region 2. 从表及字段处理
//        // 通过名称获取命名范围
//        Map<String, Name> namedRanges = workbook.getNameIndex();
//        //获取从表区域  例子： Name: "Dict_XsTZ2Dict_xsTZ2Dtl1" Ranges:"sheet1!$s$10:$V$20"
//        HashMap<String, ArrayList<String>> DtlMap = new HashMap<String, ArrayList<String>>();
//        for (var namedRange : namedRanges)
//        {
//            String CellID = namedRange.Name;
//            if (BP.DA.DataType.IsNullOrEmpty(CellID) == false && !CellID.contains("."))
//            {
//                String DtlName = CellID;
//                String range = namedRange.Ranges.toString();
//                String sheet = range.split(java.util.regex.Pattern.quote("!"), -1)[0];
//                String DtlRange = range.split(java.util.regex.Pattern.quote("!"), -1)[1];
//                String name = DtlName + "@" + DtlRange;
//                ArrayList<String> list = new ArrayList<String>();
//                DtlMap.put(name, list);
//            }
//        }
//        //获取从表中的字段  例子：Name:"Dict_XsTZ2Dict_XsTZ2Dtl1.CanYuRenEmail"  Ranges:"sheet1!$s$10:$s$10"
//        //主表，从表字段如果是枚举，单独记录
//        HashMap<String, SysEnums> EnumMap = new HashMap<String, SysEnums>();
//        for (var namedRange : namedRanges)
//        {
//            String CellID = namedRange.Name;
//            if (BP.DA.DataType.IsNullOrEmpty(CellID) == false && CellID.contains("."))
//            {
//                String DtlName = CellID.split(java.util.regex.Pattern.quote("."), -1)[0];
//                String key = CellID.split(java.util.regex.Pattern.quote("."), -1)[1];
//                String range = namedRange.Ranges.toString();
//                String sheet = range.split(java.util.regex.Pattern.quote("!"), -1)[0];
//                String CellRange = range.split(java.util.regex.Pattern.quote("!"), -1)[1];
//                String name = key + "@" + CellRange.split(java.util.regex.Pattern.quote(":"), -1)[0];
//                String DtlMapKe = ContainsKey(DtlMap, DtlName);
//                //从表字段
//                if (!DtlMapKe.equals(""))
//                {
//                    ArrayList<String> list = new ArrayList<String>();
//                    list = DtlMap.get(DtlMapKe);
//                    if (list == null)
//                    {
//                        list = new ArrayList<String>();
//                    }
//                    list.add(name);
//                    DtlMap.put(DtlMapKe, list);
//                }
//                //枚举的判断
//                MapAttr attr = new MapAttr(DtlName + "_" + key);
//                attr.RetrieveFromDBSources();
//                String uibindkey = attr.getUIBindKey();
//                if (uibindkey != null && !uibindkey.equals(""))
//                {
//                    bp.sys.SysEnums myee = new SysEnums(uibindkey);
//                    EnumMap.put(CellID, myee);
//                }
//
//            }
//        }
//        ///#endregion 从表及字段处理.
//
//        ///#region 3. 替换主表数据.
//        try
//        {
//            for (var namedRange : namedRanges)
//            {
//                String cellID = namedRange.Name;
//                if (DataType.IsNullOrEmpty(cellID) == true || cellID.contains(".") == false)
//                {
//                    continue;
//                }
//                // 找到数据.
//                String[] strs = cellID.split("[.]", -1);
//                String attrFrmID = strs[0];
//                String attrKey = strs[1];
//                //不属于从表key
//                String DtlMapKe = ContainsKey(DtlMap, attrFrmID);
//                if (!DtlMapKe.equals(""))
//                {
//                    continue;
//                }
//                //获取值.
//                String val = this.HisDB.HisDBEles.GetValByKey(attrFrmID, attrKey).AttrValue.toString();
//                //对该cell赋值.
//                // 获取命名范围的单元格
//                var range = namedRange.Ranges.First();
//                val = EnumKey(EnumMap, cellID, val);
//                // 赋值
//                range.Cell(1, 1).Value = val;
//
//            }
//        }
//        catch (RuntimeException ex)
//        {
//            throw new RuntimeException("err@VSTO模版打印错误:" + ex.getMessage());
//        }
//
//        ///#endregion 2. 替换主表数据.
//
//        ///#region 3. 替换从表数据.
//        try
//        {
//            //循环从表
//            for (Map.Entry<String, ArrayList<String>> kvp : DtlMap.entrySet())
//            {
//                // Console.WriteLine($"Key = {kvp.Key}, Value = {kvp.Value}");
//                //Dict_XsTZ2Dict_xsTZ2Dtl1@$s$10:$V$20
//                String name = kvp.getKey().split(java.util.regex.Pattern.quote("@"), -1)[0];
//                String sindexStr = kvp.getKey().split(java.util.regex.Pattern.quote("@"), -1)[1].split(java.util.regex.Pattern.quote(":"), -1)[0];
//                String eindexStr = kvp.getKey().split(java.util.regex.Pattern.quote("@"), -1)[1].split(java.util.regex.Pattern.quote(":"), -1)[1];
//                int sindex = Integer.parseInt(sindexStr.split(java.util.regex.Pattern.quote("$"), -1)[2]);
//                int eindex = Integer.parseInt(eindexStr.split(java.util.regex.Pattern.quote("$"), -1)[2]);
//                //获取值.
//                DataTable dtable = this.HisDB.getHisDBDtls().GetValByKey(name).HisDB;
//                ArrayList<String> list = new ArrayList<String>();
//                list = DtlMap.get(kvp.getKey());
//                int vsindex = 1;
//                for (DataRow row : dtable.Rows)
//                {
//                    //已超过区域
//                    if (vsindex > (eindex - sindex))
//                    {
//                        break;
//                    }
//                    for (String str : list) //CanYuRenEmail@$s$10
//                    {
//                        String key = str.split(java.util.regex.Pattern.quote("@"), -1)[0];
//                        String vkey = str.split(java.util.regex.Pattern.quote("@"), -1)[1].split(java.util.regex.Pattern.quote("$"), -1)[1];
//                        String vindexStr = str.split(java.util.regex.Pattern.quote("@"), -1)[1].split(java.util.regex.Pattern.quote("$"), -1)[2];
//                        int vindex = Integer.parseInt(vindexStr);
//                        String value = row.get(key).toString();
//                        String nkey = vkey.toUpperCase() + (vindex + vsindex);
//                        if (eindex >= (vindex + vsindex))
//                        {
//                            value = EnumKey(EnumMap, name + "." + key, value);
//                            worksheet.Cell(nkey).SetValue(value); // 获取单元格 A1 的值
//                        }
//
//                    }
//                    vsindex++;
//                }
//
//            }
//            // 保存修改
//            workbook.save();
//        }
//        catch (RuntimeException ex)
//        {
//            throw new RuntimeException("err@VSTO模版打印错误:" + ex.getMessage());
//        }
//        finally
//        {
//            // 释放COM对象（重要！）
//            worksheet = null;
//            workbook = null;
//            System.gc();
//        }
        ///#endregion 3. 替换从表数据.
    }

}
